JSON.format = formatJson = function(json, options) {
  try {
    JSON.parse(json)
  } catch (err) {
    return json
  }
  var expression;
  var formatted = '';
  var pad = 0;
  var PADDING = '  ';
  options = options || {};
  options.newlineBeforeColon = (options.newlineBeforeColon === true);
  options.spaceAfterColon = (options.spaceAfterColon !== false);
  if (typeof json !== 'string') {
    json = JSON.stringify(json)
  } else {
    json = JSON.parse(json);
    json = JSON.stringify(json)
  }
  reg = /([\{\}])/g;
  json = json.replace(reg, '\r\n$1\r\n');
  reg = /([\[\]])/g;
  json = json.replace(reg, '\r\n$1\r\n');
  reg = /(\,)/g;
  json = json.replace(reg, '$1\r\n');
  reg = /(\r\n\r\n)/g;
  json = json.replace(reg, '\r\n');
  reg = /\r\n\,/g;
  json = json.replace(reg, ',');
  if (!options.newlineBeforeColon) {
    reg = /\:\r\n\{/g;
    json = json.replace(reg, ':{');
    reg = /\:\r\n\[/g;
    json = json.replace(reg, ':[')
  }
  if (options.spaceAfterColon) {
    reg = /\:/g;
    json = json.replace(reg, ':')
  }
  (json.split('\r\n')).forEach(function(node, index) {
    var i = 0
      , indent = 0
      , padding = '';
    if (node.match(/\{$/) || node.match(/\[$/)) {
      indent = 1
    } else if (node.match(/\}/) || node.match(/\]/)) {
      if (pad !== 0) {
        pad -= 1
      }
    } else {
      indent = 0
    }
    for (i = 0; i < pad; i++) {
      padding += PADDING
    }
    formatted += padding + node + '\r\n';
    pad += indent
  });
  var data = '<pre><code class="json">' + formatted + "</code></pre>";
  if (hljs !== undefined)
    data = '<pre><code class="json">' + hljs.highlightAuto(formatted).value + "</code></pre>";
  return data
}
;
